package co.edu.javeriana.konigsberg.xavier.gui.bean;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.model.DualListModel;

import co.edu.javeriana.konigsberg.xavier.dto.DepartamentoFacultadDTO;
import co.edu.javeriana.konigsberg.xavier.servicio.DepartamentoFacultadServicioLocal;
import co.edu.javeriana.konigsberg.xavier.servicio.PaisServicioLocal;

@ManagedBean(name="departamentoFacultadBean")
@SessionScoped
public class DepartamentoFacultadBean extends ManagerBean{
	private static final long serialVersionUID = 1L;
	
	@EJB
	private DepartamentoFacultadServicioLocal departamentoFacultadServicio;
	@EJB
	private PaisServicioLocal paisServicioLocal;
	
	@ManagedProperty(value="#{facultadBean}")
	private FacultadBean facultadBean;
	
	private DualListModel<DepartamentoFacultadDTO> departamentoFacultadsPickList;
	private List<DepartamentoFacultadDTO> departamentoFacultadsSource;
	private List<DepartamentoFacultadDTO> departamentoFacultadsTarget = new ArrayList<DepartamentoFacultadDTO>();
	private List<DepartamentoFacultadDTO> departamentosSeleccionados = new ArrayList<DepartamentoFacultadDTO>();
	
	@PostConstruct
    public void init() {
		departamentoFacultadsSource = new ArrayList<DepartamentoFacultadDTO>();
		departamentoFacultadsTarget = new ArrayList<DepartamentoFacultadDTO>();
		departamentoFacultadsPickList = new DualListModel<DepartamentoFacultadDTO>(departamentoFacultadsSource, departamentoFacultadsTarget);
	}
	
	public void setFacultadBean(FacultadBean facultadBean) {
		this.facultadBean = facultadBean;
	}
	
	//====================== Principal Principio ============================//

	private BigInteger idDepartamentoFacultad;
	
	private TreeMap<String,BigInteger> departamentoFacultads;
	
	public void cuandoFacultadCambie() {
	   departamentoFacultads = new TreeMap<String, BigInteger>();
	   departamentoFacultadsSource = new ArrayList<DepartamentoFacultadDTO>();
	   List<DepartamentoFacultadDTO> departamentoFacultadDTOs = departamentoFacultadServicio.obtenerListaDePadre(facultadBean.obtenerSeleccionado());
	   for (DepartamentoFacultadDTO departamentoFacultadDTO : departamentoFacultadDTOs) {
		   departamentoFacultads.put(departamentoFacultadDTO.getNombreDepartamentoFacultad(), departamentoFacultadDTO.getIdDepartamentoFacultad());
		   departamentoFacultadsSource.add(departamentoFacultadDTO);
	   }
	   departamentoFacultadsPickList.setSource(departamentoFacultadsSource);
	   departamentoFacultadsPickList.setTarget(departamentoFacultadsTarget);
	   
	   departamentosSeleccionados = (List<DepartamentoFacultadDTO>)obtenerEnSession("departamentosSeleccionados");
	   if(departamentosSeleccionados == null){
		   departamentosSeleccionados = new ArrayList<DepartamentoFacultadDTO>();
		   cargarEnSession("departamentosSeleccionados", departamentosSeleccionados);
	   }
	}
	
	public void guardarSeleccion(ActionEvent actionEvent){
		departamentosSeleccionados = (List<DepartamentoFacultadDTO>)obtenerEnSession("departamentosSeleccionados");
		List target = departamentoFacultadsPickList.getTarget();
		for (int i = 0; i < target.size(); i++) {
			
			String departamento = (String)target.get(i);
		
			boolean yaEstaLista = false;
			
			for (DepartamentoFacultadDTO dto : departamentosSeleccionados) {
				if(dto.getNombreDepartamentoFacultad().equals(target.get(i))){
					addMessageError("El departamento facultad " + departamento + " ya ha sido adicionado");
					yaEstaLista = true;
					break;
				}
			}
			if(!yaEstaLista){
				departamentosSeleccionados.add(departamentoFacultadServicio.getDTOPorNombre(departamento));
			}
		}
		
		
		System.out.println(departamentosSeleccionados);
	}
	
	public void eliminarDepartamento(String descripcion){
		departamentosSeleccionados = (List<DepartamentoFacultadDTO>)obtenerEnSession("departamentosSeleccionados");
		departamentosSeleccionados.remove(descripcion);
    }
	
	public void eliminarDepartamento(DepartamentoFacultadDTO dto){
		departamentosSeleccionados = (List<DepartamentoFacultadDTO>)obtenerEnSession("departamentosSeleccionados");
		departamentosSeleccionados.remove(dto);
    }
	
	public Map<String, BigInteger> getDepartamentoFacultads() {
		return departamentoFacultads;
	}
	public void setDepartamentoFacultads(TreeMap<String, BigInteger> paises) {
		this.departamentoFacultads = paises;
	}
	
	public DepartamentoFacultadDTO obtenerSeleccionado(){
		DepartamentoFacultadDTO departamentoFacultadDTO = departamentoFacultadServicio.obtenerDepartamentoFacultadPorId(getIdDepartamentoFacultad());
		return departamentoFacultadDTO;
	}

	public BigInteger getIdDepartamentoFacultad() {
		return idDepartamentoFacultad;
	}

	public void setIdDepartamentoFacultad(BigInteger idDepartamentoFacultad) {
		this.idDepartamentoFacultad = idDepartamentoFacultad;
	}

	public DualListModel<DepartamentoFacultadDTO> getDepartamentoFacultadsPickList() {
		return departamentoFacultadsPickList;
	}

	public void setDepartamentoFacultadsPickList(
			DualListModel<DepartamentoFacultadDTO> departamentoFacultadsPickList) {
		this.departamentoFacultadsPickList = departamentoFacultadsPickList;
	}

	public List<DepartamentoFacultadDTO> getDepartamentoFacultadsSource() {
		return departamentoFacultadsSource;
	}

	public void setDepartamentoFacultadsSource(
			List<DepartamentoFacultadDTO> departamentoFacultadsSource) {
		this.departamentoFacultadsSource = departamentoFacultadsSource;
	}

	public List<DepartamentoFacultadDTO> getDepartamentoFacultadsTarget() {
		return departamentoFacultadsTarget;
	}

	public void setDepartamentoFacultadsTarget(
			List<DepartamentoFacultadDTO> departamentoFacultadsTarget) {
		this.departamentoFacultadsTarget = departamentoFacultadsTarget;
	}

	public List<DepartamentoFacultadDTO> getDepartamentosSeleccionados() {
		departamentosSeleccionados = (List<DepartamentoFacultadDTO>)obtenerEnSession("departamentosSeleccionados");
		return departamentosSeleccionados;
	}

	public void setDepartamentosSeleccionados(List<DepartamentoFacultadDTO> departamentosSeleccionados) {
		this.departamentosSeleccionados = departamentosSeleccionados;
	}

	public void borrarLista() {
		departamentoFacultadsPickList.setSource(new ArrayList<DepartamentoFacultadDTO>());
		departamentoFacultadsPickList.setTarget(new ArrayList<DepartamentoFacultadDTO>());
	}

	

	//====================== Principal Fin ============================//
}
